Fix menuitem hover
authorMatthias Clasen <mclasen@redhat.com>
Mon, 1 Apr 2019 01:53:55 +0000 (21:53 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 1 Apr 2019 01:53:55 +0000 (21:53 -0400)
We need to pay attention to details
of enter and leave events.

Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1795
gtk/gtkmenuitem.c

index e7213ebe587d9d543cd267008f6422611fae6546..61519becccf9f9466e62236d3574d0250e9c2943 100644 (file)
@@ -1128,6 +1128,7 @@ gtk_menu_item_enter (GtkEventController *controller,
   GtkMenuItem *menu_item = GTK_MENU_ITEM (user_data);
   GtkWidget *menu_shell;
   GdkEvent *event;
+  gboolean is_focus, contains_focus;
 
   event = gtk_get_current_event (); /* FIXME controller event */
 
@@ -1142,8 +1143,14 @@ gtk_menu_item_enter (GtkEventController *controller,
 
   menu_shell = gtk_widget_get_parent (GTK_WIDGET (menu_item));
 
+  g_object_get (controller,
+                "is-pointer-focus", &is_focus,
+                "contains-pointer-focus", &contains_focus,
+                NULL);
+
   if (GTK_IS_MENU_SHELL (menu_shell) &&
-      GTK_MENU_SHELL (menu_shell)->priv->active)
+      GTK_MENU_SHELL (menu_shell)->priv->active &&
+      (is_focus || contains_focus))
     gtk_menu_shell_select_item (GTK_MENU_SHELL (menu_shell), GTK_WIDGET (menu_item));
 }
 
@@ -1155,8 +1162,16 @@ gtk_menu_item_leave (GtkEventController *controller,
 {
   GtkMenuItem *menu_item = GTK_MENU_ITEM (user_data);
   GtkWidget *menu_shell = gtk_widget_get_parent (GTK_WIDGET (menu_item));
+  gboolean is_focus, contains_focus;
+
+  g_object_get (controller,
+                "is-pointer-focus", &is_focus,
+                "contains-pointer-focus", &contains_focus,
+                NULL);
 
-  if (GTK_IS_MENU_SHELL (menu_shell) && !menu_item->priv->submenu)
+  if (GTK_IS_MENU_SHELL (menu_shell) &&
+      !menu_item->priv->submenu &&
+      !(is_focus || contains_focus))
     gtk_menu_shell_deselect (GTK_MENU_SHELL (menu_shell));
 }